package com.demo.chapter6collect;

import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;

//自己实现一个toList收集器
//Collector<T, A, R>
//T：流中要收集的项目的泛型
//A：累加器的类型，累加器是在收集过程中用于累积部分结果的对象
//R：收集操作得到的对象的类型
public class ToListCollector<T> implements Collector<T, List<T>, List<T>> {

	@Override
	public Supplier<List<T>> supplier() {
		//建立新的结果容器，供数据收集过程使用
		return ArrayList::new;
	}

	@Override
	public BiConsumer<List<T>, T> accumulator() {
		//将元素添加到结果容器，两个参数：1、保存归约结果的累加器(已收集了流中的前n-1个项目)，2、第n个元素本身
		return List::add;
	}

	@Override
	public BinaryOperator<List<T>> combiner() {
		//合并两个容器，修改第一个累加器，将其与第二个累加器的内容合并，返回修改后的第一个累加器
		return (list1, list2) -> {
			list1.addAll(list2);
			return list1;
		};
	}

	@Override
	public Function<List<T>, List<T>> finisher() {
		//对结果容器应用最终转换，此例中累加器对象恰好符合预期的最终结果
		return Function.identity();
	}

	@Override
	public Set<java.util.stream.Collector.Characteristics> characteristics() {
		return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT));
	}

}
